小编典典

裸存储库和非裸存储库之间的实际区别是什么?

all

我一直在阅读 Git 中的裸机和非裸机/默认存储库。我一直无法很好地理解(理论上)它们之间的差异,以及为什么我应该“推送”到一个裸存储库。这是交易:

目前,我是唯一一个在 3 台不同的计算机上进行项目的人,但以后会涉及到更多的人,所以我使用 Git
进行版本控制。我在所有计算机上克隆了裸仓库,当我在其中一台计算机上完成修改时,我提交并将更改推送到裸仓库。根据我的阅读,裸存储库没有“工作树”,因此如果我克隆裸存储库,我将没有“工作树”。

我猜测工作树存储了项目中的提交信息、分支等。那不会出现在裸仓库中。因此,对我来说,使用工作树将提交“推送”到 repo 似乎更好。

那么, 我为什么要使用裸存储库,为什么不呢? 有什么实际区别?我想,这对更多从事项目工作的人没有好处。

你对这种工作有什么方法?建议?


阅读 250

收藏
2022-05-25

共1个答案

小编典典

裸存储库和非裸存储库之间的另一个区别是裸存储库没有默认的远程 存储库:

~/Projects$ git clone --bare test bare
Initialized empty Git repository in /home/derek/Projects/bare/
~/Projects$ cd bare
~/Projects/bare$ git branch -a
* master
~/Projects/bare$ cd ..
~/Projects$ git clone test non-bare
Initialized empty Git repository in /home/derek/Projects/non-bare/.git/
~/Projects$ cd non-bare
~/Projects/non-bare$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

从手册页git clone --bare

远程的分支头也直接复制到相应的本地分支头,而不将它们映射到
refs/remotes/origin/。使用此选项时,既不会创建远程跟踪分支,也不会创建相关的配置变量。

据推测,当它创建一个裸存储库时,Git 假设该裸存储库将作为多个远程用户的源存储库,因此它不会创建默认的远程源。这意味着基本git pullgit push操作将不起作用,因为 Git 假定没有工作区,您不打算对裸存储库提交任何更改:

~/Projects/bare$ git push
fatal: No destination configured to push to.
~/Projects/bare$ git pull
fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.
~/Projects/bare$
2022-05-25